package com.example.rabbit.producer.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.util.MimeType;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/producer")
@RequiredArgsConstructor
public class ProducerController {

    private final StreamBridge streamBridge;

    // 虽然 StreamBridge 将在第一次调用其 send(..) 操作时启动创建输出绑定，但是
    //  如果您想在初始化（启动）时预先创建输出绑定，您可以从 spring.cloud.stream.output-bindings 属性中获益，您可以在其中声明源的名称。
    // 提供的名称将用作创建源绑定的触发器。您可以使用 ; 来表示多个源（多个输出绑定）（例如，--spring.cloud.stream.output-bindings=foo;bar）

    @GetMapping("/send")
    public void delegateToSupplier(@RequestParam String body) {
        System.out.println("Sending " + body);
        streamBridge.send("uppercase-out-0", body);
    }

    @GetMapping("/sendToSupplier")
    public void sendToSupplier(@RequestParam String body) {
        // 在 sendToSupplier 方法内部，我们使用 StreamBridge 将数据发送到 myBinding 绑定。
        // 在这里，您也受益于 StreamBridge 的动态特性，如果 myBinding 不存在，它将被自动创建并缓存，否则将使用现有绑定。
        streamBridge.send("myBinding", body);

        // 对于使用 spring.cloud.stream.output-bindings 属性或已在不同绑定器下创建绑定的情况，binderType 参数将不起作用。
        streamBridge.send("uppercase-out-0", "rabbit", body);
        streamBridge.send("uppercase-out-0", "rabbit", body, MimeType.valueOf("text/plain"));
    }

}

// StreamBridge 和动态目的地
// StreamBridge 还可用于不知道输出目的地的情况，类似于 [Routing FROM Consumer] 部分所述的用例。
// 例如，假设我们有一个由多个消费者组成的消费者组，每个消费者都有自己的目的地。
// 我们可以使用 StreamBridge 发送消息到任意目的地，而不必事先知道目的地的名称。
// 我们只需在发送消息时指定目的地名称即可。
// 例如，假设我们有一个名为 "my-group" 的消费者组，其中包含两个消费者，分别是 "consumer1" 和 "consumer2"。